package br.com.qualityempresa.seguranca

class AutorizacaoTagLib {

	/**
	 * Renderiza o conteúdo de acordo com a regra de permissão definida.
	 *
	 * @body
	 *
	 * @attr devePossuir Se <b>true</b>, implica que usuario deve possuir o acesso de pelo menos um controle/ação. 
	 * Dessa forma o layout implicado será renderizado. Se <b>false</b>, implica que o usuário não deve possuir acesso 
	 * para controle/ação para o conteúdo ser renderizado. 
	 * @attr controles lista de controles separados por vírgula.
	 * @attr acoes lista de ações separados por vírgula.
	 */
	def permissao = {attrs, body ->
		def autorizacaoUtils = new AutorizacaoUtils()
		def controleArray
		def acaoArray
		def devePossuir = true

		if(attrs.devePossuir) {
			devePossuir = attrs.devePossuir.equals("true")
		}

		if (attrs.controles && attrs.acoes) {
			controleArray = attrs.controles.split(",")
			acaoArray = attrs.acoes.split(",")
		} else {
			throw new IllegalArgumentException('Os parametros controller e action sao obrigatorios')
		}

		if (controleArray.length != acaoArray.length) {
			throw new IllegalArgumentException('Controller e Action devem possuir a mesma quantidade de parametros')
		}

		def controle
		def acao
		def possuiPermissao = false
		for (int i = 0; i < controleArray.length; i++) {
			controle = controleArray[i]
			acao = acaoArray[i]
			if (autorizacaoUtils.verificarPermissao(controle, acao)) {
				possuiPermissao = true
				if (devePossuir) {
					out << body()
				}
				break
			}
		}
		if (!possuiPermissao && !devePossuir) {
			out << body()
		}
	}
}
